package web.java.b_metadata;

import static org.junit.Assert.*;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import org.junit.Test;

import web.java.z_Utils.DBUtils;

public class Demo01_App {
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet result;
	/**
	 * 1、数据库元数据
	 * 	主要对数据库进行查询，可以得到关于数据库的信息，例如数据库名称，url，产品名等等。
	 * */
	@Test
	public void testDB() throws Exception {
		conn=DBUtils.getConnection();
		
		//获取数据库元数据
		DatabaseMetaData metadata=conn.getMetaData();
		
		System.out.println("数据库用户名@ip地址："+metadata.getUserName());
		System.out.println("数据库URL："+metadata.getURL());
		System.out.println("数据库产品名称："+metadata.getDatabaseProductName());
		DBUtils.closeAll(conn,null);
	}
	/**
	 * 2、参数元数据
	 * */
	@Test
	public void testParams() throws Exception {
		conn=DBUtils.getConnection();
		String sql="SELECT * FROM emp WHERE emp_id=? AND emp_name=?;";
		pstmt=conn.prepareStatement(sql);
		
		//参数元数据
		ParameterMetaData pMetadata=pstmt.getParameterMetaData();
		//获取参数的个数
		int paramsCount=pMetadata.getParameterCount();
	
		System.out.println("需要输入的参数个数为："+paramsCount);
		DBUtils.closeAll(conn,pstmt);
	}
	/**
	 * 3、结果集元数据
	 * */
	@Test
	public void testResult() throws Exception {
		conn=DBUtils.getConnection();
		String sql="select * from emp;";
		pstmt=conn.prepareStatement(sql);
		result=pstmt.executeQuery();
			
		//获取结果集元数据
		ResultSetMetaData rsMetaData=pstmt.getMetaData();
		
		//1、获取列的个数
		int count=rsMetaData.getColumnCount();
		System.out.println("列的个数为："+count);
		//2、遍历，获取每一列的列的名称
		//result.next();
		//迭代输出每一行的列的值
		while(result.next()){
			for(int i=1;i<=count;i++){
				//得到列的名称
				String columnName=rsMetaData.getColumnName(i);
				//获取每一行的每一列的值
				Object columnValue=result.getObject(columnName);
				System.out.println("列名为："+columnName+"\t列值为："+columnValue);
			}
		}
		
		DBUtils.closeAll(conn,pstmt,result);
	}
}
